package com.av.db.layer.impl;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.av.db.dataobjects.Imagen;
import com.av.db.layer.interfaces.ImagenLayer;
import com.av.exceptions.AvException;

/**
 * Clase que contiene la implementacion de funciones para la tabla de imagenes
 * utilizando la tecnologia de Hibernate
 * 
 * @author Victor J Morales R
 * 
 */
public class ImagenLayerImpl extends HibernateDaoSupport implements ImagenLayer {

	private static Logger log = Logger.getLogger(ImagenLayerImpl.class);

	/**
	 * Funcion que actualiza una imagen existente en la base de datos
	 * configurada
	 */
	@Override
	public void actualizar(Imagen imagen) throws AvException {
		log.info("Inicio - actualizar(Imagen imagen)");
		log.debug("Id : " + imagen.getId());

		if (imagen == null) {
			log.error("No se puede actualizar una imagen nulo");
			throw new AvException("Imagen nula a ser actualizado");
		}

		if (imagen.getId() < 0) {
			log.error("No se puede actualizar una imagen con identificador "
					+ "invalido");
			throw new AvException("Imagen con identificador invalido a ser "
					+ "actualizada");
		}

		getHibernateTemplate().update(imagen);

		log.info("Fin - actualizar(Imagen imagen)");
	}// actualizar

	/**
	 * Funcion que agrega una imagen en la base de datos configurada
	 */
	@Override
	public void agregar(Imagen imagen) throws AvException {
		log.info("Inicio - agregar(Imagen imagen)");

		if (imagen == null) {
			log.error("No se puede agregar una imagen nula");
			throw new AvException("Imagen nula a ser agregada");
		}

		getHibernateTemplate().save(imagen);

		log.info("Fin - agregar(Imagen imagen)");
	}// agregar

	/**
	 * Funcion que elimina una imagen especifica de la base de datos configurada
	 */
	@Override
	public void eliminar(Imagen imagen) throws AvException {
		log.info("Inicio - eliminar(Imagen imagen)");
		log.debug("Id : " + imagen.getId());

		if (imagen == null) {
			log.error("No se puede eliminar una imagen nula");
			throw new AvException("Imagen nula a ser eliminada");
		}

		if (imagen.getId() < 0) {
			log
					.error("No se puede eliminar una imagen con identificador negativo");
			throw new AvException("Identificador negativo");
		}

		getHibernateTemplate().delete(imagen);

		log.info("Fin - eliminar(Imagen imagen)");
	}// eliminar

	/**
	 * Funcion que obtiene una imagen mediante identificador, de la base de
	 * datos configurada
	 */
	@Override
	public Imagen obtener(int id) {
		log.info("Inicio - obtener(int id)");
		log.debug("Id : " + id);

		if (id < 0) {
			log
					.warn("No se puede obtener una imagen con identificador negativo");
			return null;
		}

		Imagen tmp = getHibernateTemplate().get(Imagen.class, id);

		if (tmp == null) {
			log.debug("Imagen no encontrada");
		}

		log.info("Fin - obtener(int id)");

		return tmp;
	}// obtener

	/**
	 * Funcion que obtiene un conjunto de todos las imagenes registradas en la
	 * base de datos configurada
	 */
	@Override
	public Imagen[] obtener() {
		log.info("Inicio - obtener()");

		List<?> l = getSession().createCriteria(Imagen.class)
				.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).addOrder(
						Order.asc(Imagen.ID)).list();

		Imagen[] tmp = null;
		if (l != null && l.size() > 0) {
			log.debug("Cantidad obtenida : " + l.size());
			tmp = new Imagen[l.size()];
			l.toArray(tmp);
		}

		log.info("Fin - obtener()");

		return tmp;
	}// obtener
}// ImagenLayerImpl